package iexception

import (
	"database/sql"
	"fmt"

	"github.com/pkg/errors"
)

// Try handler(err)
func Try(fun func(), handler func(interface{})) {
	defer func() {
		if err := recover(); err != nil {
			handler(err)
		}
	}()
	fun()
}

// 封装底层 error, 增加更多消息，提供调用栈信息
func foo() error {
	return errors.Wrap(sql.ErrNoRows, "foo failed")
}

// 封装底层 error, 增加更多消息，但不提供调用栈信息
func bar() error {
	return errors.WithMessage(foo(), "bar failed")
}

func main() {
	err := bar()
	// Cause 返回最底层的 error, 剥去层层的 wrap
	if errors.Cause(err) == sql.ErrNoRows {
		fmt.Printf("data not found, %v\n", err)
		fmt.Printf("%+v\n", err)
		return
	}
	if err != nil {
		// unknown error
	}
}
